저는 현재 사전 미적분을 받고 계승 10의 결과를 제공하는 빠른 프로그램을 만들 것이라고 생각했습니다. 테스트하는 동안 5 번째 반복 후에 잘못된 결과가 나오는 것을 발견했습니다. 그러나 처음 4 번의 반복은 정확합니다. 퍼블릭 클래스 팩토리얼 { public static void main (String [] args) { int x = 1; int 계승; for (int n = 10; n! = 1; n--) { 계승 = n * (n-1); x = x * 계승; System.out.printf ( "% d", x); } } // 메인 클래스의 끝 } // 클래스 계승의 끝
2021-01-04 08:19:19
int 유형 (2,147,483,647)의 용량을 초과하므로 결과가 최소 int 값으로 다시 돌아갑니다. 대신 long을 사용해보십시오. 하지만 현재 사용하고있는 방법으로는 정답이 나오지 않습니다. 실제로 현재 10 개를 계산하고 있습니다! ^ 2. 복잡한 이유는 무엇입니까? 다음과 같이 쉽게 할 수 있습니다. 긴 x = 1L; for (int n = 1; n <10; n ++) { x * = n; System.out.println (x); } 1 2 6 24 120 720 5040 40320 362880 10까지 연속 계승을 보여줍니다! 도달했습니다. 또한 다른 사람들이 언급했듯이 지원할 수있는 길이보다 더 큰 값이 필요한 경우 임의 정밀도를 지원하는 BigInteger를 사용해야합니다. | 이것은 정수 오버플로 문제입니다. int 대신 long 또는 unsigned long을 사용하십시오. (그리고 @Dunes가 제안했듯이 이론적으로는 절대 오버플로되지 않기 때문에 매우 큰 숫자로 작업 할 때 가장 좋은 방법은 BigInteger입니다.) 기본 아이디어는 signed int가 -2,147,483,648에서 2,147,483,647 사이의 숫자를 저장하며, 이는 이진 비트로 저장된다는 것입니다 (컴퓨터의 모든 정보는 1과 0으로 저장 됨). 양수는 최상위 비트에서 0으로 저장되고 음수는 최상위 비트에서 1로 저장됩니다. 양수가 이진 표현에서 너무 커지면 숫자가 부호있는 비트로 넘어 가고 양수가 음의 이진 표현으로 바뀝니다. 그런 다음 팩토리얼이 unsigned int가 저장할 수있는 것보다 더 커지면 "포장"되고 가장 중요한 (서명 된) 비트의 캐리 오버를 잃게됩니다. 이것이 때때로 양수와 음수 값이 번갈아 나타나는 패턴을 보는 이유입니다. 출력에서. | 계승에 대한 공식이 잘못되었습니다. 당신이 갖게 될 것은 다음과 같습니다. 1 단계 : n * (n-1) = 10 * 9 = 90 => x = 1 * 90 = 90 2 단계 : n * (n-1) = 9 * 8 = 72 => x = 90 * 72 = 6480 또는 다음과 같아야합니다. 10 * 9 * 8 => 720 그러나 다른 사람들이 지적한 int 유형의 최대 값에 도달했다는 사실에서 잘못된 결과가 나옵니다. 귀하의 코드는 퍼블릭 클래스 팩토리얼 { public static void main (String [] args) { 이중 계승 = 1; for (int n = 계승; n> = 1; n--) { 계승 = 계승 * n; System.out.printf ( "% d", 계승); } } } | 다른 답변이 오버플로에 대해 언급 한 것 외에도 계승 알고리즘도 잘못되었습니다. 10! 10 * 9 * 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1을 계산해야합니다. (10 * 9) * (9 * 8) * (8 * 7) * (7 * 6) *을 수행하고 있습니다. .. 루프를 다음과 같이 변경해보십시오. int x = 1; for (int n = 10; n> 1; n--) { x = x * n; System.out.printf ( "% d", x); } 더 높은 수의 계승을 계산하려고하면 결국 오버플로되지만 int는 계승 10을 계산할만큼 충분히 큽니다. | 너의 답 StackExchange.ifUsing ( "editor", function () { StackExchange.using ( "externalEditor", function () { StackExchange.using ( "snippets", function () { StackExchange.snippets.init (); }); }); }, "코드 스 니펫"); StackExchange.ready (function () { var channelOptions = { 태그 : "".split ( ""), id : "1" }; initTagRenderer ( "". split ( ""), "".split ( ""), channelOptions); StackExchange.using ( "externalEditor", function () { // 스 니펫이 활성화 된 경우 스 니펫 후에 편집기를 실행해야합니다. if (StackExchange.settings.snippets.snippetsEnabled) { StackExchange.using ( "snippets", function () { createEditor (); }); } else { createEditor (); } }); function createEditor () { StackExchange.prepareEditor ({ useStacksEditor : false, heartbeatType : '답변', autoActivateHeartbeat : false, convertImagesToLinks : true, noModals : true, showLowRepImageUploadWarning : true, scoreToPostImages : 10, bindNavPrevention : true, 접미사 : "", imageUploader : { brandingHtml : "Powered by \ u003ca href = \"https : //imgur.com/ \ "\ u003e \ u003csvg class = \"svg-icon \ "width = \"50 \ "height = \"18 \ "viewBox = \ "0 0 50 18 \"fill = \ "none \"xmlns = \ "http : //www.w3.org/2000/svg \"\ u003e \ u003cpath d = \ "M46.1709 9.17788C46.1709 8.26454 46.2665 7.94324 47.1084 7.58816C47.4091 7.46349 47.7169 7.36433 48.0099 7.26993C48.9099 6.97997 49.672 6.73443 49.672 5.93063C49.672 5.22043 48.9832 4.61182 48.1414 4.6931182C47.4335 4.61182 46.7256 4.52513.6307884.65959531 43.5251. 43.1481 6.59048V11.9512C43.1481 13.2535 43.6264 13.8962 44.6595 13.8962C45.6924 13.8962 46.1709 13.2535 46.1709 11.9512V9.17788Z \ "/ \ u003e \ u003cpath d = \"M32.492 10.1419C32.492 12.697954 34.104182 14.0484 37.0451 14.0484 41.5985 12.6954 41.5985 10.1419V6.59049C41.5985 5.28821 41.1394 4.66232 40.1061 4.66232C39.0732 4.66232 38.5948 5.28821 38.5948 6.59049V9.60062C38.5948 10.8521 38.2696 11.5455 37.0451 11.5455C35.8209 11.5455 35.4954 10.8 521 35.4954 9.60062V6.59049C35.4954 5.28821 35.0173 4.66232 34.0034 4.66232C32.9703 4.66232 32.492 5.28821 32.492 6.59049V10.1419Z \ "/ \ u003e \ u003cpath fill-rule = \"evenodd \ "clip-rule = \"evenodd \ "d = \ "M25.6622 17.6335C27.8049 17.6335 29.3739 16.9402 30.253715.6379C30.8468 14.7755 30.9615 13.5579 30.9615 11.9512V6.59049C30.9615 5.28821 30.4833 4.66231 29.4502 4.66231C28.9913 4.66231 28.4555 4.94978 28.1109 5.50789C27.499 4.86533 26.7335 4.56073 25.7134985 9.56087C23.13491.05.31342932. 13.913C26.5612 13.913 27.4607 13.4902 28.1109 12.6616C28.1109 12.7229 28.1161 12.7799 28.121 12.8346C28.1256 12.8854 28.1301 12.9342 28.1301 12.983C28.1301 14.4373 147.2502 15.2321 25.777 15.212183.5661 14.79349 15.212183.5661 224.79349 15.2321 24.631354 .7977 14.5218 21.2429 15.0123 21.2429 15.6887C21.2429 16.7375 22.9072 17.6335 25.6622 17.6335ZM24.1317 9.27932C24.1317 7.94324 24.9928 7.09766 26.1024 7.09766C27.2119 7.09766 28.0918 7.94311 1317 10.11697371024 1,1163174.1317 10.116976321649.2119 1317. 9.27932Z \ "/ \ u003e \ u003cpath d = \"M16.8045 11.9512C16.8045 13.2535 17.2637 13.8962 18.2965 13.8962C19.3298 13.8962 19.8079 13.2535 19.8079 11.9512V8.12928C19.8079 5.82936 18.4879 4.62866 16.4027 4.62866C15.1594 4.62866 14.279 4.98375 13.3609 5.88013C12.653 5.05154 11.6581 4.62866 10.3573 4.62866C9.34336 4.62866 8.57809 4.89931 7.93662 5.5032C7.5662 5.28821 5.00066 6.59049V11.9512C5.00066 13.2535 5.47873 13.8962 6.51203 13.8962C7.54479 13.8962 8.0232 13.2535 8.0232 11.9512V8.90741C8.0232 7.58817 8.44431 6.91179 9.53458 6.91179C10.5104 6.91179 10.893 7.5883.2535 11.893 8.94108V11.53458 6.91179C10.5104 6.91179 10.893 7.5883.2535 11.893 13.894108V11.53458 .4375 13.8962 13.9157 13.2535 13.9157 11.9512V8.90741C13.9157 7.58817 14.3365 6.91179 15.4269 6.91179C16.4027 6.91179 16.8045 7.58817 16.8045 8.94108V11.9512Z \ "/ \ u003e \ u003662 5.28821 2.83 4.66232 1.82471 6.59049C3.31675 4.66232C0.791758 4.66232 0.313354 5.28821 0.313354 6.59049V11.9512C0.313354 13.2535 0.791758 13.8962 1.82471 13.8962C2.85798 13.8962 3.31675 13.2535 3.31675 11.9512V6.59049Z \ "/ \ u003e \ u 003cpath d = \ "M1.87209 0.400291C0.843612 0.400291 0 1.1159 0 1.98861C0 2.87869 0.822846 3.57676 1.87209 3.57676C2.90056 3.57676 3.7234 2.87869 3.7234 1.98861C3.7234 1.1159 2.90056 0.400291 1.87209 0.400291Z \"fill = \ "# 1BB76E \" / \ u003e \ u003c / svg \ u003e \ u003c / a \ u003e ", contentPolicyHtml : "\ u003ca href = \"https : //stackoverflow.com/help/licensing \ "\ u003ecc by-sa \ u003c / a \ u003e \ u003ca href = \"https://stackoverflow.com에 따라 라이선스가 부여 된 사용자 기여 / legal / content-policy \ "\ u003e (콘텐츠 정책) \ u003c / a \ u003e", allowUrls : true }, onDemand : true, 폐기 선택기 : ".discard-answer" , immediatelyShowMarkdownHelp : true, enableTables : true, enableSnippets : true }); } }); Stack Overflow에 대한 답변에 기여해 주셔서 감사합니다! 질문에 반드시 답해주십시오. 세부 사항을 제공하고 연구를 공유하십시오! 그러나 피하십시오… 도움, 설명을 요청하거나 다른 답변에 응답합니다. 의견에 근거한 진술 작성 참고 자료 또는 개인적인 경험으로 백업하십시오. 자세한 내용은 훌륭한 답변 작성에 대한 팁을 참조하십시오. 초안 저장 초안이 삭제되었습니다. 가입 또는 로그인 StackExchange.ready (function () { StackExchange.helpers.onClickDraftSave ( '# login-link'); }); Google을 사용하여 가입 Facebook을 사용하여 가입 이메일 및 비밀번호를 사용하여 가입 제출 게스트로 게시 이름 이메일 필수이지만 표시되지 않음 StackExchange.ready ( 함수 () { StackExchange.openid.initPostLogin ( '. new-post-login', 'https % 3a % 2f % 2fstackoverflow.com % 2fquestions % 2f13772608 % 2ffactorial-loop-results-are-incorrect-after-the-5th-iteration % 23new- answer ','question_page '); } ); 게스트로 게시 이름 이메일 필수이지만 표시되지 않음 답변 게시 포기 "답변 게시"를 클릭하면 서비스 약관, 개인 정보 보호 정책 및 쿠키 정책에 동의하게됩니다. 찾고있는 답변이 아닙니까? java 태그가 지정된 다른 질문을 찾아 보거나 직접 질문하십시오.